home *** CD-ROM | disk | FTP | other *** search
/ PC User 2003 January / Disc 3 / Amethyst.iso / live / lib / hotplug / hotplug-pci < prev    next >
Encoding:
Text File  |  2002-11-04  |  1.3 KB  |  54 lines

  1. #!/usr/bin/perl
  2. # handle plugging in PCI modules
  3. #PCI_CLASS=%04X                - done
  4. #PCI_ID=%04X:%04X            - done
  5. #PCI_SUBSYS_ID=%04X:%04X
  6. #PCI_SLOT_NAME=%s
  7.  
  8. $uname=`uname -r`;chomp($uname);
  9.  
  10. $pciclass = ord $ENV{'PCI_CLASS'};
  11. $pciclass = $pciclass << 8;
  12.  
  13. ($vendor,$product) = split(/:/,$ENV{'PCI_ID'});
  14. ($subvendor,$subproduct) = split(/:/,$ENV{'PCI_SUBSYS_ID'});
  15.  
  16. if ($ENV{'ACTION'} eq 'add') {
  17.     if (!open(PCIMAP,"/lib/modules/$uname/modules.usbmap")) {
  18.         warn "could not open PCIMAP:$!\n";
  19.         exit 0;
  20.     }
  21.     $vars = <PCIMAP>;    # first line lists all variables.
  22.     chomp($vars);
  23.     $vars =~ s/^# //g;
  24.     $vars =~ s/^pci //g;
  25.     @vars = split($vars);
  26.     # pci module vendor device subvendor subdevice class class_mask driver_data
  27.     for ($i=0;$i<$#vars;$i++) {
  28.         $vi{$var[$i]} = $i;
  29.     }
  30.     while (<PCIMAP>) {
  31.         chomp;
  32.         @vals = split;
  33.  
  34.         if ($val[$vi{'vendor'}] ne "0xffffffff") {
  35.             # vendor/device based
  36.             if (    ($vendor  == $val[$vi{'vendor'}]) &&
  37.                 ($product == $val[$vi{'device}])
  38.             ) {
  39.                 system("/sbin/modprobe -k $module");
  40.                 next;
  41.             }
  42.         } else {
  43.             $xc = oct $val[$vi{'class'}];
  44.             $xm = oct $val[$vi{'class_mask'}];
  45.             if (($class & $xm) == $xc) {
  46.                 print "class based match for $classmask / $pciclass{$classmask}\n";
  47.                 system("/sbin/modprobe -k $module");
  48.                 next;
  49.             }
  50.         }
  51.     }
  52.     close(PCIMAP);
  53. }
  54.